<?php

/**
 * parte actions.
 *
 * @package    ACATEC
 * @subpackage parte
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class parteActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
  	$this->getUser()->setAttribute('current','parte');
  	 
  	 // Creamos una vble de usuario que contendrá el id de la empresa
        // Tomamos el nombre de usuario, para obtener a través de la consulta cruzada el id de la empresa
        $user = $this->getContext()->getUser()->getGuardUser();
        $username = $user->getUsername();
    
        //Creamos la consulta para obtener el idempresa a partir del nombre de usuario
        $q = Doctrine_Query::create()
            ->select('empresa_id')
            ->from('CrmContacto c')
            ->where('c.id IN (SELECT u.contacto_id FROM CrmUserContacto u WHERE u.user_id IN 
                             (SELECT s.id FROM SfGuardUser s WHERE s.username= ?))',$username);

        $empresa_id = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);
    
        // Y el resultado lo guardamos en la vble de sesión.
        $this->getUser()->setAttribute('empresa_id', $empresa_id['empresa_id']);
  		 
  	// Definimos la cultura del usuario por defecto
  	//$this->getUser()->setCulture(sfConfig::get('app_culture_default','es'));
  	$this->getUser()->setCulture('es');
  	 
  	 
  	//$this->crm_presupuestos = Doctrine_Core::getTable('CrmPresupuesto')
  	//  ->createQuery('a')
  	//  ->execute();
  	  
    if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
    {
      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
    }

    // pager
    if ($request->getParameter('page'))
    {
      $this->setPage($request->getParameter('page'));
    }
    $this->pager = $this->getPager();
    $this->sort = $this->getSort();
  }

  public function executeFilter(sfWebRequest $request)
  {
    $this->setPage(1);

    if ($request->hasParameter('_reset'))
    {
      $this->setFilters(array());

      $this->redirect('@crm_parte');
    }

    $this->filters = new CrmParteFormFilter($this->getFilters());

    $this->filters->bind($request->getParameter($this->filters->getName()));
    if ($this->filters->isValid())
    {
      $this->setFilters($this->filters->getValues());

      $this->redirect('@crm_parte');
    }

    $this->pager = $this->getPager();
    $this->sort = $this->getSort();

    $this->setTemplate('index');
  }
  
  public function executeShow(sfWebRequest $request)
  {
  	$this->parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id')));
        $this->parte->calcular();
  	$this->cliente = Doctrine_Core::getTable('CrmContacto')->find($this->parte->getClienteId());
  	$this->vehiculo = $this->parte->getCrmVehiculo();
  	$this->conceptos = $this->parte->getCrmParteConcepto();
  }

  public function executeNew(sfWebRequest $request)
  {
    /** NOTA DE MEJORA
  	    *****************************************************************************************
  	 En el modulo de inicio se inicializan las vbles de sesión.
  	 Debería controlarse de algún modo que estas vbles hayan sido creadas al llegar a este punto
  	 puesto que puede que el usuario no haya pasado por el punto inicial. **/
  
        //Establezco esta vble de sesión que indica que vengo de un nuevo parte para volver aquí
        $this->getUser()->setAttribute('nuevo_parte',1);  
        //Borro las vbles de sesion de los otros documentos
        $this->getUser()->getAttributeHolder()->remove('nuevo_pto');
        $this->getUser()->getAttributeHolder()->remove('nueva_fra');
        
        // Cargamos el valor del nuevo parte (el número por el que debe comenzar si es el primero)
        if ($this->esPrimerAlbaran()) {    
            $this->redirect('configuracion/primerAlbaran');            
        }    
        else {
            // Si viene de vehiculo porque trae id de contacto y de vehiculo
            if ($request->getParameter('contacto_id')) { 
                $this->forward404Unless($crm_contacto = Doctrine_Core::getTable('CrmContacto')->find(array($request->getParameter('contacto_id'))), sprintf('Object crm_vehiculo does not exist (%s).', $request->getParameter('id')));      
                $crm_parte = new CrmParte();
                $crm_parte->setCrmContacto($crm_contacto);
                $this->cliente = $crm_contacto;
                $this->forward404Unless($crm_vehiculo = Doctrine_Core::getTable('CrmVehiculo')->find(array($request->getParameter('vehiculo_id'))), sprintf('Object crm_vehiculo does not exist (%s).', $request->getParameter('id')));      
                $crm_parte->setCrmVehiculo($crm_vehiculo);                
                $this->vehiculo = $crm_vehiculo;
                //Asigno un valor a los kilometros
                $crm_parte->setKms($crm_vehiculo->getKms());
                // le paso los datos del vehiculo y del cliente al formulario
                $this->form = new CrmParteForm($crm_parte);
                
            }
            else{
                $this->cliente = null;
                $this->vehiculo = null;
                $this->form = new CrmParteForm();
            }
            
            $empresa_id = $this->getUser()->getAttribute('empresa_id');
            
  	    //Cogemos de la BD el numero que le corresponde
            $campo = "numAlbaran";
            $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
            $this->numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
                       
            $campo = "tipoIVA";
            $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c2')
            ->where('c2.campo = ?',$campo);
            $tipo_iva = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
           
            // Cargamos el valor del nuevo presupuesto
            $this->form->getObject()->setEmpresaId($empresa_id);
            $this->form->setDefault('numero', $this->numero);
            $this->form->setDefault('descuento', 0);
            $today = date("Y-m-d");
            $this->form->setDefault('fecha', $today);
            $this->form->setDefault('tipo', $tipo_iva);
      }      
  }

  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->form = new CrmParteForm();
    $this->processForm($request, $this->form);
    $this->setTemplate('new');
  }

  public function executeEdit(sfWebRequest $request)
  {
    $this->getUser()->setAttribute('nuevo_parte',0);
    $this->getUser()->setAttribute('accion','editar');
    $this->forward404Unless($this->parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id'))), sprintf('Object crm_parte does not exist (%s).', $request->getParameter('id')));
    if (null == $this->parte->getDescuento()){
        $this->parte->setDescuento(0);
    }
    $this->cliente = $this->parte->getCrmContacto();
    $this->vehiculo = $this->parte->getCrmVehiculo();
    $this->parte->calcular();
    $this->form = new CrmParteForm($this->parte);
  }
  
  public function executeActualizaClienteId(sfWebRequest $request){
     $cliente_id=$request->getParameter('cliente_id');
     $this->cliente = Doctrine_Core::getTable('CrmContacto')->findOneById($cliente_id);
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneByClienteId($cliente_id);
     $this->vehiculos = Doctrine_Core::getTable('CrmVehiculo')->getVehiculoByClienteIdQuery($cliente_id)->execute();
  }   
  
  public function executeActualizaBusquedaClienteId(sfWebRequest $request){
     $this->cliente = Doctrine_Core::getTable('CrmContacto')->findOneById($request->getParameter('cliente_id'));
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneByClienteId($request->getParameter('cliente_id'));
     $this->vehiculos = Doctrine_Core::getTable('CrmVehiculo')->getVehiculoByClienteIdQuery($request->getParameter('cliente_id'))->execute();
     $this->clientes = Doctrine_Core::getTable('CrmContacto')->findAll();
     $cliente = $this->cliente;
     $vehiculo = $this->vehiculo;
     $clientes = $this->clientes;
     $vehiculos = $this->vehiculos;
  }   
  
  public function executeActualizaVehiculoId(sfWebRequest $request){
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneById($request->getParameter('vehiculo_id'));
  }
  
  public function executeUpdate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($crm_parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id'))), sprintf('Object crm_parte does not exist (%s).', $request->getParameter('id')));
    $crm_parte->calcular();
    $this->form = new CrmParteForm($crm_parte);

    $this->processForm($request, $this->form);

    $this->setTemplate('edit');
  }
  
  public function executeAddConcepto(sfWebRequest $request){
  	$this->forward404unless($request->isXmlHttpRequest());
  	$number = intval($request->getParameter("num"));
        
  	$this->form = new CrmParteForm();
  	$this->form->addNewFields($number);
  	return $this->renderPartial('addNewConcepto',array('form' => $this->form, 'number' => $number));
  }
  
  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($crm_parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id'))), sprintf('Object crm_parte does not exist (%s).', $request->getParameter('id')));
    $crm_parte->delete();
    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Los elementos seleccionados han sido eliminados.'));
    $this->redirect('parte/index');
  }

  /*
   * Método creado para presupuestar un parte, sin embargo al guardar primero en la BD, si la 
   * edición del presupuesto se cancela, este ya se ha guardado por lo que deberemos controlar
   * con una vble de sesión si eso ocurre y borrarlo de la Bd en tal caso.
   */
  public function executePresupuestar(sfWebRequest $request)
  {
     //Veo si ya está presupuestado, en cuyo caso muestro un mensaje
     $this->parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id')));
     if ($this->parte->is_validated == TRUE) {
         $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: La orden nº '.$this->parte->getNumero().' ya está presupuestada'));
         $this->redirect('@crm_parte');
     } 
     else {
         //Si no está presupuestado...
         //Creo un nuevo objeto presupuesto
         $presupuesto = new CrmPresupuesto();
         //Establecemos el numero de presupuesto que le corresponde
         $campo = "numPresupuesto";
         $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
         $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
         //Y asignamos los valores de la orden de trabajo a los campos del presupuesto       
         $presupuesto->setNumero($numero);
         $presupuesto->setObservaciones($this->parte->getObservaciones());
         $presupuesto->setTotal($this->parte->getTotal());
         $presupuesto->setClienteId($this->parte->getClienteId());
         $presupuesto->setPersonalId($this->parte->getPersonalId());
         $presupuesto->setEmpresaId($this->parte->getEmpresaId());
         $presupuesto->setVehiculoId($this->parte->getVehiculoId());
         $presupuesto->setTipo($this->parte->getTipo());
         $presupuesto->setImporte($this->parte->getImporte());
         $presupuesto->setDescuento($this->parte->getDescuento());
         $presupuesto->setBase($this->parte->getBase());
         $presupuesto->setIva($this->parte->getIva());
         $presupuesto->setKms($this->parte->getKms());
         //Para la fecha asignamos la fecha actual, no la del parte
         $today = date("Y-m-d");
         $presupuesto->setFecha($today);

         //Lo guardamos en la base de datos
         $presupuesto->save();  
         
         
         //Cogemos la lista de conceptos               
         foreach ($this->parte->getCrmParteConcepto() as $concepto){
             //Creamos un nuevo concepto
             $concepto_pto = new CrmPresupuestoConcepto();
             //Le pasamos los datos del concepto_parte
             $concepto_pto->setCantidad($concepto->getCantidad());
             $concepto_pto->setConcepto($concepto->getConcepto());
             $concepto_pto->setPrecioUnitario($concepto->getPrecioUnitario());
             $concepto_pto->setDescuento($concepto->getDescuento());
             $concepto_pto->setSubtotal($concepto->getSubtotal());
             $concepto_pto->setIva($concepto->getIva());
             $concepto_pto->setTotal($concepto->getTotal());
             //Y ponemos el id del presupuesto que acabamos de guardar
             $concepto_pto->setPresupuestoId($presupuesto->getId());
             //Lo guardamos en la base de datos
             $concepto_pto->save();
         }
         
         //Lo marcamos como presupuestado
         $this->parte->is_validated = true;
         $this->parte->save();
         //Como todo ha sido correcto, actualizamos el numero de presupuesto
         //Creo la consulta
         $q = Doctrine_Query::create()
              ->update('CrmConfiguracion cf')
              ->set('cf.valor','?',$numero+1)
              ->where('cf.campo = ?',$campo);
         //Y la lanzo
         $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
         //Mostramos un mensaje por pantalla
         //NOTA: CAMBIAR EL MENSAJE A MOSTRAR CON LOS NÚMEROS SI PARECE!!!!!!!!!!!!!!!!!!!!!!
         $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La orden nº '.$this->parte->getNumero().' se ha presupuestado (Presupuesto nº '.$numero.')'));
         
         //Creo una vble que me permita borrar de la base de datos lo insertado, si cancelo la edición del presupuesto.
         $this->getUser()->setAttribute('borrarBD',$request->getParameter('id'));

         //$this->presupuesto = $presupuesto;
         //$this->redirect('@crm_parte');
         //Al hacerlo así, parece que carga dos veces, no sé porqué
         $this->redirect('@crm_presupuesto_edit?id='.$presupuesto->getId());                  
     }
     
  } 
  
  /*
   * Método creado para facturar un parte, sin embargo al guardar primero en la BD, si la 
   * edición de la factura se cancela, esta ya se ha guardado por lo que deberemos controlar
   * con una vble de sesión si eso ocurre y borrarla de la Bd en tal caso.
   */
  public function executeFacturar(sfWebRequest $request)
  {
     //Veo si ya está facturado, en cuyo caso muestro un mensaje
     $this->parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id')));
     if ($this->parte->remove_it == TRUE) {
         $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: La orden nº '.$this->parte->getNumero().' ya está facturada'));
         $this->redirect('@crm_parte');
     } 
     else {
         //Si no está facturada...
         //Creo un nuevo objeto Factura
         $fra = new CrmFactura();
         //Establecemos el numero de presupuesto que le corresponde
         $campo = "numFactura";
         $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
         $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
         //Y asignamos los valores de la orden de trabajo a los campos de la factura       
         $fra->setNumero($numero);
         $fra->setObservaciones($this->parte->getObservaciones());
         $fra->setTotal($this->parte->getTotal());
         $fra->setClienteId($this->parte->getClienteId());
         $fra->setPersonalId($this->parte->getPersonalId());
         $fra->setEmpresaId($this->parte->getEmpresaId());
         $fra->setVehiculoId($this->parte->getVehiculoId());
         $fra->setTipo($this->parte->getTipo());
         $fra->setImporte($this->parte->getImporte());
         $fra->setDescuento($this->parte->getDescuento());
         $fra->setBase($this->parte->getBase());
         $fra->setIva($this->parte->getIva());
         $fra->setKms($this->parte->getKms());
         //Para la fecha asignamos la fecha actual, no la del parte
         $today = date("Y-m-d");
         $fra->setFecha($today);

         //La guardamos en la base de datos
         $fra->save();  
         
         
         //Cogemos la lista de conceptos               
         foreach ($this->parte->getCrmParteConcepto() as $concepto){
             //Creamos un nuevo concepto
             $concepto_fra = new CrmFacturaConcepto();
             //Le pasamos los datos del concepto_parte
             $concepto_fra->setCantidad($concepto->getCantidad());
             $concepto_fra->setConcepto($concepto->getConcepto());
             $concepto_fra->setPrecioUnitario($concepto->getPrecioUnitario());
             $concepto_fra->setDescuento($concepto->getDescuento());
             $concepto_fra->setSubtotal($concepto->getSubtotal());
             $concepto_fra->setIva($concepto->getIva());
             $concepto_fra->setTotal($concepto->getTotal());
             //Y ponemos el id de la factura que acabamos de guardar
             $concepto_fra->setFacturaId($fra->getId());
             //Lo guardamos en la base de datos
             $concepto_fra->save();
         }
         
         //Lo marcamos como facturado
         $this->parte->remove_it = true;
         $this->parte->save();
         //Como todo ha sido correcto, actualizamos el numero de factura
         //Creo la consulta
         $q = Doctrine_Query::create()
              ->update('CrmConfiguracion cf')
              ->set('cf.valor','?',$numero+1)
              ->where('cf.campo = ?',$campo);
         //Y la lanzo
         $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
         //Mostramos un mensaje por pantalla
         //NOTA: CAMBIAR EL MENSAJE A MOSTRAR CON LOS NÚMEROS SI PARECE!!!!!!!!!!!!!!!!!!!!!!
         $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La orden nº '.$this->parte->getNumero().' se ha facturado (Factura nº '.$numero.')'));
         
         //Creo una vble que me permita borrar de la base de datos lo insertado, si cancelo la edición del presupuesto.
         $this->getUser()->setAttribute('borrarBDfromPte',$request->getParameter('id'));

         //$this->presupuesto = $presupuesto;
         //$this->redirect('@crm_parte');
         //Al hacerlo así, parece que carga dos veces, no sé porqué
         $this->redirect('@crm_factura_edit?id='.$fra->getId());                  
     }
     
  } 
  
  public function executeBatch(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

	if (!$action = $request->getParameter('batch_action'))
    {
      $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debes seleccionar una acción'));

      $this->redirect('@crm_parte');
    }

    if (!$ids = $request->getParameter('ids'))
    {
	  if ($action == 'batchPrint')  // Le hemos dado a imprimir pero sin seleccionar nada. IMPRIMIR TODO
      {
    		if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    		{
      			throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    		}
    		// execute batch executeBachPrint sin ids
      		$this->$method($request);
      }
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('Debes seleccionar al menos un elemento'));

      $this->redirect('@crm_parte');
    }

    if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    {
      throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    }


    $validator = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'CrmParte'));
    try
    {
      // validate ids
      $ids = $validator->clean($ids);

      // execute batch
      $this->$method($request);
    }
    catch (sfValidatorError $e)
    {
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('A problem occurs when deleting the selected items as some items do not exist anymore.'));
    }

    $this->redirect('@crm_parte');
  }
  
  public function executeImprimir(sfWebRequest $request)
  {
  	// Cargamos el helper para la fecha
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  
  	// Recogemos los datos del presupuesto
  	$parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id')));
  	$this->forward404Unless($parte);
  	$cliente = Doctrine_Core::getTable('CrmContacto')->find($parte->getClienteId());
  	$vehiculo = $parte->getCrmVehiculo();
  	$conceptos = $parte->getCrmParteConcepto();
  	$conceptosData = $conceptos->getData();
  
        //Tomo los datos de la empresa de la base de datos.
        $id_empresa = $this->getUser()->getAttribute('empresa_id');
        $empresa = Doctrine_Core::getTable('CrmEmpresa')->find(array($id_empresa));
  
  	//Cargamos los datos del pdf
  	$config = sfTCPDFPluginConfigHandler::loadConfig();
  	// pdf object
  	$pdf = new FONDOPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  	$saltoEncabezado = PDF_HEADER_STRING;
  	$limite = 230;
  	$numpagina = 1;
  	$separ = 1;
  
  	// Definimos los metadatos
  	$pdf->setMetadata();
  
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(0);
  	$pdf->SetFooterMargin(0);
  
  	// remove default footer
  	$pdf->setPrintFooter(false);
  
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  
  	//set some language-dependent strings
  	//$pdf->setLanguageArray($l);
  
  	// ---------------------------------------------------------
  
  	// add a page
  	$pdf->AddPage();
  
  	// get the current page break margin
  	$bMargin = $pdf->getBreakMargin();
  	// get current auto-page-break mode
  	$auto_page_break = $pdf->getAutoPageBreak();
  	// disable auto-page-break
  	$pdf->SetAutoPageBreak(false, 0);
  	// set bacground image
  	$img_file = sfConfig::get('pdf_imagenfondo');
  	$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  	// restore auto-page-break status
  	$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  	// set the starting point for the page content
  	$pdf->setPageMark();
  
  	$pdf->escribeDatosEmpresa($empresa);
  	$pdf->escribeLogo($empresa);
  	$pdf->escribeTextoDocumento();
  	$pdf->escribeDocumento('Orden',$parte->getNumero(),$numpagina, format_date($parte->getFecha(), "d"), $cliente, $vehiculo, $parte->getKms());
  
  	$conceptos=$pdf->escribeConceptos($conceptos);
  	while ($conceptos->count()!=0){
  		$pdf->escribeTotales($parte, false);
  		$numpagina = $numpagina+1;
  		// add a page
  		$pdf->AddPage();
  		// get the current page break margin
  		$bMargin = $pdf->getBreakMargin();
  		// get current auto-page-break mode
  		$auto_page_break = $pdf->getAutoPageBreak();
  		// disable auto-page-break
  		$pdf->SetAutoPageBreak(false, 0);
  		// set bacground image
  		$img_file = sfConfig::get('pdf_imagenfondo');
  		$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  		// restore auto-page-break status
  		$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  		// set the starting point for the page content
  		$pdf->setPageMark();
  		$pdf->escribeDatosEmpresa($empresa);
  		$pdf->escribeLogo($empresa);
  		$pdf->escribeTextoDocumento();
  		$pdf->escribeDocumento('Orden',$parte->getNumero(),$numpagina, format_date($parte->getFecha(), "d"), $cliente, $vehiculo, $parte->getKms());
  		$conceptos=$pdf->escribeConceptos($conceptos);
  	}
  	$pdf->escribeTotales($parte,true);
  
        //Escribo las observaciones solo en la última página
        $pdf->escribeObservaciones();
  	
  	// Close and output PDF document
  	$pdf->Output('Orden '.$parte->getNumero().'.pdf', 'I');
  
  	// Stop symfony process
  	throw new sfStopException();
  
  }
  
  protected function imprimeDocumento(FONDOPDF $pdf, CrmParte $parte)
  {
  	// Cargamos el helper para la fecha
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  
  	// Recogemos los datos del presupuesto
  	$cliente = Doctrine_Core::getTable('CrmContacto')->find($parte->getClienteId());
  	$vehiculo = $parte->getCrmVehiculo();
  	$conceptos = $parte->getCrmParteConcepto();
  	$conceptosData = $conceptos->getData();
  
        //Tomo los datos de la empresa de la base de datos.
        $id_empresa = $this->getUser()->getAttribute('empresa_id');
        $empresa = Doctrine_Core::getTable('CrmEmpresa')->find(array($id_empresa));
 
  	$saltoEncabezado = PDF_HEADER_STRING;
  	$limite = 230;
  	$numpagina = 1;
  	$separ = 1;
  
  	// Definimos los metadatos
  	$pdf->setMetadata();
  
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(0);
  	$pdf->SetFooterMargin(0);
  
  	// remove default footer
  	$pdf->setPrintFooter(false);
  
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  
  	// add a page
  	$pdf->AddPage();
  
  	// get the current page break margin
  	$bMargin = $pdf->getBreakMargin();
  	// get current auto-page-break mode
  	$auto_page_break = $pdf->getAutoPageBreak();
  	// disable auto-page-break
  	$pdf->SetAutoPageBreak(false, 0);
  	// set bacground image
  	$img_file = sfConfig::get('pdf_imagenfondo');
  	$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  	// restore auto-page-break status
  	$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  	// set the starting point for the page content
  	$pdf->setPageMark();
  
  	$pdf->escribeDatosEmpresa($empresa);
  	$pdf->escribeLogo($empresa);
  	$pdf->escribeTextoDocumento();
  	$pdf->escribeDocumento('Orden',$parte->getNumero(),$numpagina, format_date($parte->getFecha(), "d"), $cliente, $vehiculo, $parte->getKms());
  
  	$conceptos=$pdf->escribeConceptos($conceptos);
  	while ($conceptos->count()!=0){
  		$pdf->escribeTotales($parte, false);
  		$numpagina = $numpagina+1;
  		// add a page
  		$pdf->AddPage();
  		// get the current page break margin
  		$bMargin = $pdf->getBreakMargin();
  		// get current auto-page-break mode
  		$auto_page_break = $pdf->getAutoPageBreak();
  		// disable auto-page-break
  		$pdf->SetAutoPageBreak(false, 0);
  		// set bacground image
  		$img_file = sfConfig::get('pdf_imagenfondo');
  		$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  		// restore auto-page-break status
  		$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  		// set the starting point for the page content
  		$pdf->setPageMark();
  		$pdf->escribeDatosEmpresa($empresa);
  		$pdf->escribeLogo($empresa);
  		$pdf->escribeTextoDocumento();
  		$pdf->escribeDocumento('Orden',$parte->getNumero(),$numpagina, format_date($parte->getFecha(), "d"), $cliente, $vehiculo, $parte->getKms());
  		$conceptos=$pdf->escribeConceptos($conceptos);
  	}
  	$pdf->escribeTotales($parte,true);
        //Escribo las observaciones solo en la última página
        $pdf->escribeObservaciones();
  	  
  }
  
  protected function executeBatchPrint(sfWebRequest $request)
  {
  
  	if (!$ids = $request->getParameter('ids')){
            //imprimir sin ids imprime nada
            $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debe de selecionar al menos uno para imprimir.'));
            /* $records = Doctrine_Query::create()
            ->from('CrmParte')
            ->execute(); */
  	} else {   // imprime solo los ids selecionados
            $records = Doctrine_Query::create()
                ->from('CrmParte')
      		->whereIn('id', $ids)
          	->execute();
  
  	//Cargamos los datos del pdf
  	$config = sfTCPDFPluginConfigHandler::loadConfig();
  	// pdf object
  	$pdf = new FONDOPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    	foreach ($records as $record)
  	{
  	$this->imprimeDocumento($pdf, $record);
  	}
  	// Close and output PDF document
  	$pdf->Output('Lista de Ordenes.pdf', 'I');
    		
      		// Stop symfony process
  	throw new sfStopException();
  	}

  	$this->redirect('@crm_parte');
  }
  
  
  
  protected function executeBatchDelete(sfWebRequest $request)
  {
    $ids = $request->getParameter('ids');

    $records = Doctrine_Query::create()
      ->from('CrmParte')
      ->whereIn('id', $ids)
      ->execute();

    foreach ($records as $record)
    {
      $record->delete();
    }

    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Los elementos seleccionados han sido eliminados.'));
    $this->redirect('@crm_parte');
  }

  protected function executeBatchPresupuestar(sfWebRequest $request)
  {
        if (!$ids = $request->getParameter('ids')){
  		//presupuestar sin ids imprime nada
                $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debe de selecionar al menos uno para presupuestar.'));
  		/* $records = Doctrine_Query::create()
  		->from('CrmParte')
  		->execute(); */
  	} else {   // presupuesta solo los ids selecionados
            $records = Doctrine_Query::create()
                ->from('CrmParte')
      		->whereIn('id', $ids)
          	->execute();
        }
  	foreach ($records as $record)
  	{
            $this->presupuestarGrupo($record);
  	}
        
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Los elementos seleccionados se han presupuestado'));
        $this->redirect('@crm_parte'); //No tengo muy claro a donde direccionarlo ni el msj a dar (confuso si mezcla erroneos y correctos)
  }
  
  protected function executeBatchFacturar(sfWebRequest $request)
  {
        if (!$ids = $request->getParameter('ids')){
  		//presupuestar sin ids imprime nada
                $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debe selecionar al menos un elemento para facturar.'));
  	} else {   // presupuesta solo los ids selecionados
            $records = Doctrine_Query::create()
                ->from('CrmParte')
      		->whereIn('id', $ids)
          	->execute();
        }
  	foreach ($records as $record)
  	{
            $this->facturarGrupo($record);
  	}
        
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Los elementos seleccionados se han facturado'));
        $this->redirect('@crm_parte'); //No tengo muy claro a donde direccionarlo ni el msj a dar (confuso si mezcla erroneos y correctos)
  }
  
  public function presupuestarGrupo(CrmParte $parte)
  {
     //Veo si ya está presupuestado, en cuyo caso no hago nada
     if ($parte->is_validated == TRUE) {
         
     } 
     else {
         //Si no está presupuestado...
         //Creo un nuevo objeto presupuesto
         $presupuesto = new CrmPresupuesto();
         //Establecemos el numero de presupuesto que le corresponde
         $campo = "numPresupuesto";
         $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
         $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
         //Y asignamos los valores de la orden de trabajo a los campos del presupuesto       
         $presupuesto->setNumero($numero);
         $presupuesto->setObservaciones($parte->getObservaciones());
         $presupuesto->setTotal($parte->getTotal());
         $presupuesto->setClienteId($parte->getClienteId());
         $presupuesto->setPersonalId($parte->getPersonalId());
         $presupuesto->setEmpresaId($parte->getEmpresaId());
         $presupuesto->setVehiculoId($parte->getVehiculoId());
         $presupuesto->setTipo($parte->getTipo());
         $presupuesto->setImporte($parte->getImporte());
         $presupuesto->setDescuento($parte->getDescuento());
         $presupuesto->setBase($parte->getBase());
         $presupuesto->setIva($parte->getIva());
         $presupuesto->setKms($parte->getKms());
         //Para la fecha asignamos la fecha actual, no la del parte
         $today = date("Y-m-d");
         $presupuesto->setFecha($today);

         //Lo guardamos en la base de datos
         $presupuesto->save();  
         
         //Cogemos la lista de conceptos               
         foreach ($parte->getCrmParteConcepto() as $concepto){
             //Creamos un nuevo concepto
             $concepto_pto = new CrmPresupuestoConcepto();
             //Le pasamos los datos del concepto_parte
             $concepto_pto->setCantidad($concepto->getCantidad());
             $concepto_pto->setConcepto($concepto->getConcepto());
             $concepto_pto->setPrecioUnitario($concepto->getPrecioUnitario());
             $concepto_pto->setDescuento($concepto->getDescuento());
             $concepto_pto->setSubtotal($concepto->getSubtotal());
             $concepto_pto->setIva($concepto->getIva());
             $concepto_pto->setTotal($concepto->getTotal());
             //Y ponemos el id del presupuesto que acabamos de guardar
             $concepto_pto->setPresupuestoId($presupuesto->getId());
             //Lo guardamos en la base de datos
             $concepto_pto->save();
         }
         
         //Lo marcamos como presupuestado
         $parte->is_validated = true;
         $parte->save();
         //Como todo ha sido correcto, actualizamos el numero de presupuesto
         //Creo la consulta
         $q = Doctrine_Query::create()
              ->update('CrmConfiguracion cf')
              ->set('cf.valor','?',$numero+1)
              ->where('cf.campo = ?',$campo);
         //Y la lanzo
         $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);     
         
     }
     
  }
  
  public function facturarGrupo(CrmParte $parte)
  {
     //Veo si ya está facturado, en cuyo caso no hago nada
     if ($parte->remove_it == TRUE) {
         
     } 
     else {
          $fra = new CrmFactura();
          //Establecemos el numero de factura que le corresponde
          $campo = "numFactura";
          $q = Doctrine_Query::create()
                        ->select('valor')
                        ->from('CrmConfiguracion c1')
                        ->where('c1.campo = ?',$campo);
          $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
          //Y asignamos los valores del parte a los campos de la factura     
          $fra->setNumero($numero);
          $fra->setObservaciones($parte->getObservaciones());
          $fra->setTotal($parte->getTotal());
          $fra->setClienteId($parte->getClienteId());
          $fra->setPersonalId($parte->getPersonalId());
          $fra->setEmpresaId($parte->getEmpresaId());
          $fra->setVehiculoId($parte->getVehiculoId());
          $fra->setTipo($parte->getTipo());
          $fra->setImporte($parte->getImporte());
          $fra->setDescuento($parte->getDescuento());
          $fra->setBase($parte->getBase());
          $fra->setIva($parte->getIva());
          $fra->setKms($parte->getKms());
          //Para la fecha asignamos la fecha actual, no la del parte
          $today = date("Y-m-d");
          $fra->setFecha($today);
                
          //Lo guardamos en la base de datos
          $fra->save();  
         
          //Cogemos la lista de conceptos               
          foreach ($parte->getCrmParteConcepto() as $concepto){
                    //Creamos un nuevo concepto
                    $concepto_fra = new CrmFacturaConcepto();
                    //Le pasamos los datos del concepto_presupuesto
                    $concepto_fra->setCantidad($concepto->getCantidad());
                    $concepto_fra->setConcepto($concepto->getConcepto());
                    $concepto_fra->setPrecioUnitario($concepto->getPrecioUnitario());
                    $concepto_fra->setDescuento($concepto->getDescuento());
                    $concepto_fra->setSubtotal($concepto->getSubtotal());
                    $concepto_fra->setIva($concepto->getIva());
                    $concepto_fra->setTotal($concepto->getTotal());
                    //Y ponemos el id de la factura que acabamos de guardar
                    $concepto_fra->setFacturaId($fra->getId());
                    //Lo guardamos en la base de datos
                    $concepto_fra->save();
          } //foreach
         
          //Lo marcamos como facturado
          $parte->remove_it = true;
          $parte->save();
          //Como todo ha sido correcto, actualizamos el numero de factura
          //Creo la consulta
          $q = Doctrine_Query::create()
                        ->update('CrmConfiguracion cf')
                        ->set('cf.valor','?',$numero+1)
                        ->where('cf.campo = ?',$campo);
          //Y la lanzo
          $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);    
         
     }
     
  }
  
  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    
    if ($form->isValid())
    {        
      $crm_parte = $form->save();
      
      //Si vengo de un nuevo parte y todo ha sido correcto, tendré un nuevo número
      //también puedo venir de una edición
      if ($this->getUser()->getAttribute('nuevo_parte') == 1){
            //Actualizamos el siguiente numero de presupuesto
            $campo = "numAlbaran";
            // Creo la consulta
            $q = Doctrine_Query::create()
                ->update('CrmConfiguracion cf')
                ->set('cf.valor','?',$crm_parte->getNumero()+1)
                ->where('cf.campo = ?',$campo);
            //Y la lanzo
            $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      }      
      
      //Actualizo el valor de kilometros de Vehiculos con los del parte
      $q = Doctrine_Query::create()
                ->update('CrmVehiculo v')
                ->set('v.kms','?',$form->getValue('kms'))
                ->where('v.id = ?',$form->getValue('vehiculo_id'));
      //Y la lanzo
      $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      //$this->redirect('presupuesto/edit?id='.$crm_presupuesto->getId());
      $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La orden '.$crm_parte->getNumero().' ha sido actualizada'));
      $this->redirect('parte/index');
    }
  }

  protected function getFilters()
  {
    return $this->getUser()->getAttribute('parte.filters');
  }

  protected function setFilters(array $filters)
  {
    return $this->getUser()->setAttribute('parte.filters', $filters);
  }

  protected function getPager()
  {
    $campo = "numRegistros";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('CrmConfiguracion c1')
    ->where('c1.campo = ?',$campo);
    $numelementos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
    $pager = new sfDoctrinePager('CrmParte', $numelementos);
    //$pager = new sfDoctrinePager('CrmParte', sfConfig::get('app_list_max_partes'));
    $pager->setQuery($this->buildQuery());
    $pager->setPage($this->getPage());
    $pager->init();

    return $pager;
  }

  protected function setPage($page)
  {
    $this->getUser()->setAttribute('parte.page', $page);
  }

  protected function getPage()
  {
    return $this->getUser()->getAttribute('parte.page', 1);
  }

  protected function buildQuery()
  {
    $tableMethod = 'CrmParte';
    $filterValues = $this->getFilters();
    $this->valores = $filterValues;
    //create a default query
    $query = Doctrine_Core::getTable('CrmParte')->createQuery('p');

    if (null === $this->filtro)
    {
      $this->filtro = new CrmParteFormFilter($filterValues);
    }

    //if the form have been submited
    if($filterValues){
      //bind the values
      $this->filtro->bind($filterValues);
      //if valid, specialise the request using the form
      if($this->filtro->isValid())
         $query = $this->filtro->getQuery();
    }

    $this->addSortQuery($query);

    $event = $this->dispatcher->filter(new sfEvent($this, 'crm.build_query'), $query);
    $query = $event->getReturnValue();

    return $query;
  }

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
    {
      $sort[1] = 'asc';
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

  protected function getSort()
  {
    if (null !== $sort = $this->getUser()->getAttribute('parte.sort'))
    {
      return $sort;
    }

    $this->setSort(array('id',sfConfig::get('app_sort_default','asc')));

    return $this->getUser()->getAttribute('parte.sort');
  }

  protected function setSort(array $sort)
  {
    if (null !== $sort[0] && null === $sort[1])
    {
      $sort[1] = 'asc';
    }

    $this->getUser()->setAttribute('parte.sort', $sort);
  }

  protected function isValidSortColumn($column)
  {
    return Doctrine_Core::getTable('CrmParte')->hasColumn($column);
  }
  
  protected function esPrimerAlbaran(){
    $campo = "primerAlbaran";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('CrmConfiguracion c1')
    ->where('c1.campo = ?',$campo);
    $primera = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
    return $primera;
  }  
}
